home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 38 / Amiga Format CD38 (1999-03-15)(Future Publishing)(GB)(Track 1 of 3)[!][issue 1999-04].iso / -seriously_amiga- / programming / other / cyberxxxsrc / misc / bestmodeid.mod < prev    next >
Text File  |  1999-02-08  |  8KB  |  221 lines

  1. MODULE  BestModeID;
  2.  
  3. (* $StackChk- $OvflChk- $RangeChk- $CaseChk- $ReturnChk- $NilChk- $TypeChk- $OddChk- $ClearVars- *)
  4.  
  5. (* /// ------------------------------- "IMPORT" -------------------------------- *)
  6. IMPORT  asl:=ASL,
  7.         cgfx:=CyberGraphics,
  8.         e:=Exec,
  9.         gfx:=Graphics,
  10.         i2m:=Intel2Mot,
  11.         u:=Utility,
  12.         y:=SYSTEM;
  13. (* \\\ ------------------------------------------------------------------------- *)
  14.  
  15. (* /// --------------------------------- "VAR" --------------------------------- *)
  16. VAR     smrHook: u.HookPtr;
  17.         desiredWidth: LONGINT;
  18.         desiredHeight: LONGINT;
  19.         desiredDepth: LONGINT;
  20.         forceAGA: BOOLEAN;
  21. (* \\\ ------------------------------------------------------------------------- *)
  22.  
  23. (* /// ---------------------- "PROCEDURE SMReqHookFunc()" ---------------------- *)
  24. PROCEDURE SMReqHookFunc(hook: u.HookPtr;
  25.                         req: asl.ScreenModeRequesterPtr;
  26.                         id: LONGINT): LONGINT;
  27.  
  28. VAR     modeDepth: LONGINT;
  29.         modeWidth: LONGINT;
  30.         modeHeight: LONGINT;
  31.         dimInfo: gfx.DimensionInfo;
  32.         dispInfo: gfx.DisplayInfo;
  33.         aspect: REAL;
  34.  
  35. (* /// ------------------------ "PROCEDURE GetAspect()" ------------------------ *)
  36.   PROCEDURE GetAspect(rect: gfx.Rectangle): REAL;
  37.   BEGIN
  38.     RETURN (rect.maxX-rect.minX+1)/(rect.maxY-rect.minY+1);
  39.   END GetAspect;
  40. (* \\\ ------------------------------------------------------------------------- *)
  41.  
  42. BEGIN
  43.   IF forceAGA THEN
  44.     y.SETREG(0,gfx.GetDisplayInfoData(NIL,dimInfo,SIZE(dimInfo),gfx.dtagDims,id));
  45.     aspect:=GetAspect(dimInfo.nominal);
  46.     modeDepth:=dimInfo.maxDepth;
  47.     modeWidth:=dimInfo.nominal.maxX-dimInfo.nominal.minX+1;
  48.     modeHeight:=dimInfo.nominal.maxY-dimInfo.nominal.minY+1;
  49.     IF (desiredDepth<=8) & (modeDepth<=8) & (modeWidth>=desiredWidth) & (modeHeight>=desiredHeight) & (aspect>1.0) & (aspect<1.65) THEN RETURN e.true; END;
  50.   ELSE
  51.     IF cgfx.IsCyberModeID(id) THEN
  52.       modeDepth:=cgfx.GetCyberIDAttr(cgfx.idAttrDepth,id);
  53.       modeWidth:=cgfx.GetCyberIDAttr(cgfx.idAttrWidth,id);
  54.       modeHeight:=cgfx.GetCyberIDAttr(cgfx.idAttrHeight,id);
  55.       IF (desiredDepth<=8) & (modeDepth<=8) & (modeWidth>=desiredWidth) & (modeHeight>=desiredHeight) THEN RETURN e.true; END;
  56.       IF (desiredDepth>8) & (modeDepth>8) & (modeWidth>=desiredWidth) & (modeHeight>=desiredHeight) THEN RETURN e.true; END;
  57.     END;
  58.   END;
  59.   RETURN e.false;
  60. END SMReqHookFunc;
  61. (* \\\ ------------------------------------------------------------------------- *)
  62.  
  63. (* /// ---------------------- "PROCEDURE IgnoreIfFalse()" ---------------------- *)
  64. PROCEDURE IgnoreIfFalse(tagVal{0}: u.TagID;
  65.                         tagData{1}: BOOLEAN): u.TagID;
  66. BEGIN
  67.   IF tagData THEN
  68.     RETURN tagVal;
  69.   ELSE
  70.     RETURN u.ignore;
  71.   END;
  72. END IgnoreIfFalse;
  73. (* \\\ ------------------------------------------------------------------------- *)
  74.  
  75. (* /// ------------------------ "PROCEDURE BestMode()" ------------------------- *)
  76. PROCEDURE BestMode * (width: LONGINT;
  77.                       height: LONGINT;
  78.                       depth: LONGINT;
  79.                       aga: BOOLEAN;
  80.                       ham: BOOLEAN): LONGINT;
  81.  
  82. VAR     id: LONGINT;
  83.         w: LONGINT;
  84.         h: LONGINT;
  85.         hinc: LONGINT;
  86.         dim: gfx.DimensionInfo;
  87.  
  88. BEGIN
  89.   IF aga OR ham THEN
  90.     IF gfx.pal IN gfx.base.displayFlags THEN (* PAL oder NTSC? *)
  91.       w:=i2m.Round(width,160);
  92.       h:=i2m.Round(height,128);
  93.       IF h=128 THEN h:=256; END;
  94.     ELSE
  95.       w:=i2m.Round(width,160);
  96.       h:=i2m.Round(height,100);
  97.       IF h=100 THEN h:=200; END;
  98.     END;
  99.     WHILE w<h DO w:=i2m.Round(w*2,160); END;
  100.     id:=gfx.BestModeID(gfx.bidTagNominalWidth,w,
  101.                        gfx.bidTagNominalHeight,h,
  102.                        gfx.bidTagDepth,depth,
  103.                        IgnoreIfFalse(gfx.bidTagDipfMustHave,ham),LONGSET{gfx.isHAM},
  104.                        u.done);
  105.   ELSE
  106.     w:=i2m.Round(width,320);
  107.     h:=i2m.Round(height,240);
  108.     IF depth<8 THEN depth:=8; END;
  109.     WHILE w<h DO w:=i2m.Round(w*2,160); END;
  110.     id:=cgfx.BestCModeIDTags(cgfx.bIDTGNominalWidth,w,
  111.                              cgfx.bIDTGNominalHeight,h,
  112.                              cgfx.bIDTGDepth,depth,
  113.                              u.done);
  114.   END;
  115.   RETURN id;
  116. END BestMode;
  117. (* \\\ ------------------------------------------------------------------------- *)
  118.  
  119. (* /// ------------------- "PROCEDURE SelectModeIDSimple()" -------------------- *)
  120. PROCEDURE SelectModeIDSimple * (width: LONGINT;
  121.                                 height: LONGINT;
  122.                                 ham: BOOLEAN): LONGINT;
  123.  
  124. VAR     id: LONGSET;
  125.  
  126. BEGIN
  127.   id:=LONGSET{};
  128.   IF width>384 THEN INCL(id,gfx.hires); END;
  129.   IF height>283 THEN INCL(id,gfx.lace); END;
  130.   IF ham THEN INCL(id,gfx.ham); END;
  131.   RETURN y.VAL(LONGINT,id);
  132. END SelectModeIDSimple;
  133. (* \\\ ------------------------------------------------------------------------- *)
  134.  
  135. (* /// -------------------- "PROCEDURE SelectModeIDByReq()" -------------------- *)
  136. PROCEDURE SelectModeIDByReq * (width: LONGINT;
  137.                                height: LONGINT;
  138.                                depth: LONGINT;
  139.                                initID: LONGINT;
  140.                                aga: BOOLEAN;
  141.                                ham: BOOLEAN): LONGINT;
  142.  
  143. VAR     scrModeReq: asl.ScreenModeRequesterPtr;
  144.         minDepth: LONGINT;
  145.         maxDepth: LONGINT;
  146.         id: LONGINT;
  147.  
  148. BEGIN
  149.   desiredWidth:=width;
  150.   desiredHeight:=height;
  151.   desiredDepth:=depth;
  152.   IF (depth>8) & ~aga & ~ham THEN
  153.     minDepth:=15;
  154.     maxDepth:=32;
  155.     forceAGA:=FALSE;
  156.   ELSE
  157.     minDepth:=depth;
  158.     maxDepth:=8;
  159.     forceAGA:=TRUE;
  160.   END;
  161.   id:=initID;
  162.   scrModeReq:=asl.AllocAslRequestTags(asl.screenModeRequest,u.done);
  163.   IF scrModeReq#NIL THEN
  164.     IF asl.AslRequestTags(scrModeReq,asl.initialDisplayID,initID,
  165.                                      asl.smMinWidth,width,
  166.                                      asl.smMinHeight,height,
  167.                                      asl.smMinDepth,minDepth,
  168.                                      asl.smMaxDepth,maxDepth,
  169.                                      asl.smFilterFunc,smrHook,
  170.                                      IgnoreIfFalse(asl.smPropertyFlags,ham),LONGSET{gfx.isHAM},
  171.                                      IgnoreIfFalse(asl.smPropertyMask,ham),LONGSET{gfx.isHAM},
  172.                                      u.done) THEN
  173.       id:=scrModeReq.displayID;
  174.     END;
  175.     asl.FreeAslRequest(scrModeReq);
  176.   END;
  177.   RETURN id;
  178. END SelectModeIDByReq;
  179. (* \\\ ------------------------------------------------------------------------- *)
  180.  
  181. (* /// ----------------------- "PROCEDURE CalcModeID()" ------------------------ *)
  182. PROCEDURE CalcModeID * (idStr: ARRAY OF CHAR): LONGINT; (* $CopyArrays- *)
  183.  
  184. VAR     x: INTEGER;
  185.         max: INTEGER;
  186.         goon: BOOLEAN;
  187.         id: LONGINT;
  188.  
  189. BEGIN
  190.   id:=0;
  191.   IF (idStr[0]="$") OR ((idStr[0]="0") & (idStr[1]="x")) THEN
  192.     IF idStr[0]="$" THEN
  193.       x:=1;
  194.       max:=9;
  195.     ELSE
  196.       x:=2;
  197.       max:=10;
  198.     END;
  199.     goon:=TRUE;
  200.     WHILE (x<max) & (idStr[x]#00X) & goon DO
  201.       id:=id*16;
  202.       CASE CAP(idStr[x]) OF
  203.       | "0".."9": INC(id,ORD(idStr[x])-ORD("0"));
  204.       | "A".."F": INC(id,ORD(CAP(idStr[x]))-ORD("A")+10);
  205.       ELSE
  206.         id:=0;
  207.         goon:=FALSE;
  208.       END;
  209.       INC(x);
  210.     END;
  211.   END;
  212.   RETURN id;
  213. END CalcModeID;
  214. (* \\\ ------------------------------------------------------------------------- *)
  215.  
  216. BEGIN
  217.   NEW(smrHook);
  218.   u.InitHook(smrHook,y.VAL(u.HookFunc,SMReqHookFunc));
  219. END BestModeID.
  220.  
  221.